// using System;
// using System.Collections.Generic;
// using System.Linq;
// using UnityEngine;

// namespace JPS {
// 	internal enum JPSDir {
// 		// 轴向
// 		N = 0,
// 		E,
// 		S,
// 		W,
// 		// 对角线
// 		NE,
// 		SE,
// 		SW,
// 		NW,
// 	}

// 	public abstract class PathFinder {
// 		public bool useBB;
// 		// public GoalBounding BB;
// 		public abstract List<Vector2Int> FindPath(Vector2Int start, Vector2Int goal);
// 	}

// 	internal static class JPSUtils {
// 		internal const float SQRT2 = 1.414213562f;
// 		internal static Vector2Int[] DirToVec = new Vector2Int[8]
// 		{
// 			Vector2Int.up,
// 			Vector2Int.right,
// 			Vector2Int.down,
// 			Vector2Int.left,
// 			new Vector2Int(1, 1),
// 			new Vector2Int(1, -1),
// 			new Vector2Int(-1, -1),
// 			new Vector2Int(-1, 1)
// 		};
// 		internal static int[] OppositeDirIdx = new int[8]
// 		{
// 			2, 3, 0, 1,
// 			6, 7, 4, 5
// 		};
// 		internal static Dictionary<JPSDir, JPSDir[]> ValidDirLookUpTable = new Dictionary<JPSDir, JPSDir[]>
// 		{
// 			{ JPSDir.S,      new []{ JPSDir.W,  JPSDir.SW, JPSDir.S, JPSDir.SE, JPSDir.E } },
// 			{ JPSDir.SE, new []{ JPSDir.S, JPSDir.SE, JPSDir.E } },
// 			{ JPSDir.E,       new []{ JPSDir.S, JPSDir.SE, JPSDir.E, JPSDir.NE, JPSDir.N } },
// 			{ JPSDir.NE, new []{ JPSDir.E,  JPSDir.NE, JPSDir.N } },
// 			{ JPSDir.N,      new []{ JPSDir.E,  JPSDir.NE, JPSDir.N, JPSDir.NW, JPSDir.W } },
// 			{ JPSDir.NW, new []{ JPSDir.N, JPSDir.NW, JPSDir.W } },
// 			{ JPSDir.W,       new []{ JPSDir.N, JPSDir.NW, JPSDir.W, JPSDir.SW, JPSDir.S } },
// 			{ JPSDir.SW, new []{ JPSDir.W,  JPSDir.SW, JPSDir.S } }
// 		};
// 		internal static readonly Vector2Int NullVec = new Vector2Int(-1, -1);
// 		internal static readonly JPSDir[] allDirections = Enum.GetValues(typeof(JPSDir)).Cast<JPSDir>().ToArray();
// 	}
// }